package com.yangfan.thread.thread_wangwenjun03;


import java.time.Instant;

/**
 * @description: 负责收集的线程服务
 * @author: yangfan
 * @date: Created in 2020/1/26 0026 12:39
 * @modified By:
 * <p>
 * {@link ThreadForcedInterrupt} 线程中断案例
 */


public class ThreadService {


    //private Thread tMain;

    //private volatile boolean finish = false;//标记

    /**
     * 原理：在主线程内 ，创建一个 子线程并且 设置为 守护线程
     * 这样 如果需要强制关闭线程的情况下 中断主线程  守护线程也就会自己关闭了，从而达到关闭效果
     */

//    public void startTask(Runnable runnable) {
//
//        tMain = new Thread("T-main") {
//
//            @Override
//            public void run() {
//
//                Thread childThread = new Thread(runnable, "childThread");
//                childThread.setDaemon(true);//子线程设置成 守护线程
//                childThread.start();
//
//                try {
//                    childThread.join();
//                    finish = true;//操作完成修改标记状态
//                } catch (InterruptedException e) {
//                    //一旦被中断这里则会捕获中断异常
//
//                }
//
//            }
//        };
//        tMain.start();
//
//    }


    /**
     * 线程停止的方法 根据给定的时间 去停止，如果 30秒还没有执行完毕就 停止
     *      会抛出线程未初始化的异常
     */
//    public void stopTask(Long second)  {
////
////        long startTime = System.currentTimeMillis();
////
////        while (!finish){
////            if(System.currentTimeMillis() - startTime >= second){//判断是否超市
////                System.out.println("超时了！！！");
////                tMain.interrupt();//中断 T-main 线程
////                break;//打断后退出去
////            }
////        }
////
////        finish = false;
////    }



    private Thread mainThread ;//主线程

    private volatile boolean finish = false ;//结束标记


    /**
     * 数据采集
     * @param task 任务
     */
    public void dataCollection(Runnable task){

        mainThread = new Thread("mainThread"){

            @Override
            public void run() {

                Thread workerThread = new Thread(task);
                workerThread.setDaemon(true);//把工作线程设置为守护线程
                workerThread.start();

                //让主线程等待
                try {

                    workerThread.join();//让 mainThread 线程 等待  workerThread 线程执行完毕后在进行修改 finish
                    finish = true;

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }



            }
        };



    }


    /**
     * 停止数据采集
     * @param specifiedTime 指定的等待时间
     */
    public void stopDataCollection(Long specifiedTime){

        long startTime = Instant.now().toEpochMilli();

        while (!finish){

            System.out.println("判断是否完成");

            if((Instant.now().toEpochMilli() - startTime) >= specifiedTime){
                System.out.println("操作超时了！！！即将停止！！！");
                mainThread.interrupt();//中断主线程
                break;
            }


        }

        finish = false;

    }






























}
